/*
 * Copyright (c) 2022, tyustli
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-03-17     tyustli      first implementation
 */

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

/*
30 个人在一条船上，超载，需要 15 人下船。

于是人们排成一队，排队的位置即为他们的编号。

报数，从 1 开始，数到 9 的人下船。

如此循环，直到船上仅剩 15 人为止，问都有哪些编号的人下船了呢？
*/

#define NUM_CNT_DROP_OUT       9
#define PEOPLE_DROP_OUT        15
#define PEOPLE_TOTAL_NUM       30

#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))

int main(int argc, char *argv[])
{
    unsigned char people_total[PEOPLE_TOTAL_NUM + 1] = {0}; /* 0 表示在船上 1 表示不在船上，初始状态下所有人均在船上 */

    char cnt = 0;
    char index = 1;
    char tmp = 0;
    while (cnt < PEOPLE_DROP_OUT) /* 一共需要 15 个人下船 */
    {
        for (; index <= ARRAY_SIZE(people_total); index++) /* 数组下标 1-30 表示编号 */
        {
            if (index == ARRAY_SIZE(people_total)) /* 到达数组末尾 */
                index = 1;
            if (people_total[index] == 0)
            {
                tmp++;
            }
            if (tmp == NUM_CNT_DROP_OUT)
            {
                break;
            }
        }

        people_total[index] = 1; /* 1 表示不在船上 */
        printf("%d 编号下船了\r\n", index);
        cnt++;
        tmp = 0;
    }

    return 0;
}

/************************ end of time ************************/
